package day23;

public class Demo04 {
	public static void main(String[] args) {
		Ticket t = new Ticket();

		new Thread(t).start();
		new Thread(t).start();
		new Thread(t).start();
		new Thread(t).start();
		//		new Thread(t).start();
		//		new Thread(t).start();

		// 线程安全问题
		// 当多个线程操作同一个资源时
		// 某一个线程的操作还没有执行完毕
		// 其它线程就已经参与执行
		// 导致共享数据出现错误

		// 假设有某间商店, 货架上只剩最后一件商品: X
		// 有销售员A和销售员B同时进行销售行为
		// 有客户甲由A接待, 甲要购买X, A在货架上看到了X, 可以进行销售
		// A完成销售之前, 客户乙由B接待, 同样要购买X, B在货架上也看到了X
		// B开始执行销售行为
		// B完成销售之前, A的销售完成了, X被卖掉了
		// B的销售行为就出了问题

		// 解决方案
		// 1: 当A售卖X时, 将X拿在手里, 不允许别人访问它
		// 即: 当某个线程操作共享资源时, 不允许其它线程访问共享资源
		// 2: 当A进行销售行为时, 不允许B进行销售行为
		// 即: 当某个线程执行操作共享数据的方法时, 不允许其它线程调用该方法
		// synchronized: 同步锁
		// 同步代码块, 同步方法

	}
}

// ------------------------------

class Ticket implements Runnable {

	// 假设有1张票
	private int tick = 1;

	private Object obj = new Object();

	@Override
	public synchronized void run() {
		// synchronized (obj) {
			if (tick > 0) {
				System.out.println(Thread.currentThread().getName() + "卖出: " + tick--);
			} else {
				System.out.println(Thread.currentThread().getName() + ", 没有票了");
			}
		// }
	}

}